vlwkaos' digital garden

Rust - control flow, pattern matching

if

fn bigger(a: i32, b: i32) -> i32 {
    if (a > b) {
        a
    } else { // 괄호 꼭 필요하다
        b
    }
}

// else if

이렇게 대입도 할 수 있다.

// 같은 타입에 대해 아래처럼. 삼항 연산자?
let n = if 10 < 100 {
    10
} else {
    100
};

loop

'a: loop {
    println!("loop a");
    'b: loop {
        break 'a // 끝
    }
    continue 'a // a 시작으로
}

while

while n == 10 {
    n = n - 1;
}

for

let a = vec![10,20,30,40,50];
// for each
for i in a {
    println!("i: {}", i);

}

// exclusive range .. , inclusive is ..=
for i in 1..101 {
    // 1 to 100
}

for _ in 0..=3 {
    println!("no need no nubmer");
}

match

  • switch 와 같음 근데 더 강력하다
  • exhaustive 하다
let x = 5;
match x {
    1 => println!("one"),
    2 => println!("two"),
    3 | 4 | 5 => println!("three, four, five"),
    13 ... 19 => println!("teen"), // iterate match
    _ => println!("Else"),
}

// tuple
let pair = (0,-2);
match pair {
    (0, y) => println!("y: {}", y),
    (x, 0) => println!("x: {}", x),
    (x, y) if x == y => println!("equals"),
    _ => println!("nuhuh"),
}

// copy와 비슷, match하면 n으로 binding
// 이런식으로 값을 정의할수도있다.
let p = 5;
match p {
    n @ 1 ... 12 => println!("n: {}", n),
    n @ 13 ... 19 => println!("n: {}", n),
    _ => println!("none"),
}

// match 는 하나만. 
fn match_colors(rgb: (u8, u8, u8)) {
    match rgb {
        (r, _, _) if r < 10 => println!("not much red"),
        (_, g, _) if g < 10 => println!("not much green"),
        (_, _, b) if b < 10 => println!("not much blue"),
        _ => println!("any color")
    }
}

fn match_num(input: i32) {
    match input {
        number @ 0..=10 => println!("0~10: {}", number),
        _ => println!("other num")
    }

}


fn main() {
    // 이거 아니면 이거 할때 type이 달라지면? 안됨
    let a = 8;
    let b = if a == 10 { 8 } else { "Wrong" };
}

Referred in

Rust - control flow, pattern matching